#include "key.h"

key_infor_t key_infor = {0};

void key_init(void)
{
	/* clk 配置 */
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_IOMUX, ENABLE); // 使能时钟
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
	GPIO_IOMUX_ChangePin(IOMUX_PIN2, IOMUX_PD5_SEL_PD5); // 配置 SWDIO to PD5

	/* gpio 配置 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

	GPIO_Init(GPIOD, &GPIO_InitStructure);
}

void key_process(void)
{
	key_infor.key_state = GPIO_ReadInputDataBit(KEY_TYPE, KEY_PIN);
	// printf("key_state = %d \n", key_infor.key_state);

	switch (key_infor.flag)
	{
	/* 初始状态检查按键被按下 */
	case 0:
		if (key_infor.key_state == 0)
		{
			key_infor.flag = 1;
		}
		break;

		/* 按键被按下检查按下的时常是否超过设定时间 */
	case 1:
		if (++key_infor.cnt >= TOUCH_KEY_LONG_TIME) // 超时直接退出进入按键状态执行
		{
			key_infor.long_short = 1;
			key_infor.flag = 2;
			break;
		}
		if (key_infor.key_state == 1) // 松开则设置为短按状态
		{
			key_infor.long_short = 0;
			key_infor.flag = 2;
		}
		break;

		/* 长按被松开后检测回到无按下操作时回到最初状态 */
	case 3:
		if (key_infor.key_state == 1)
		{
			key_infor.flag = 0;
			key_infor.cnt = 0;
		}
		break;
	}
}

void key_operation(void)
{
	if (key_infor.flag == 2) // 按键按下并释放
	{
		if (key_infor.long_short == 1) // 长按
		{
			printf("key_infor.long_short = 1 \n");
		}
		else // 长按
		{
			printf("key_infor.long_short = 0 \n");
			if (nt3_infor.display_type >= DISP_VOLTAGE_POWER)
				nt3_infor.display_type = DISP_VOLTAGE;
			else
				nt3_infor.display_type++;
		}

		key_infor.flag = 3;
	}
}
